{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "from d2l import torch as d2l"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 含并行连结的网络（GoogLeNet）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Inception块"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {
    "notebookRunGroups": {
     "groupValue": "2"
    }
   },
   "source": [
    "![20_7_1.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Inception(nn.Module):\n",
    "    #c1--c4是每条路径的输出通道数\n",
    "    def __init__(self,in_channels,c1,c2,c3,c4,**kwargs):\n",
    "        #让 Inception 类继承自 nn.Module 的构造函数，并确保任何通过 **kwargs 传递的额外参数能够被正确初始化\n",
    "        super(Inception,self).__init__(**kwargs)\n",
    "\n",
    "        #线路1 单独1x1卷积层\n",
    "        self.p1_1=nn.Conv2d(in_channels,c1,kernel_size=1)\n",
    "        #线路2 1x1卷积层后接3x3卷积层\n",
    "        self.p2_1=nn.Conv2d(in_channels,c2[0],kernel_size=1)\n",
    "        self.p2_2=nn.Conv2d(c2[0],c2[1],kernel_size=3,padding=1)\n",
    "        #线路3 1x1卷积层后接5x5卷积层\n",
    "        self.p3_1=nn.Conv2d(in_channels,c3[0],kernel_size=1)\n",
    "        self.p3_2=nn.Conv2d(c3[0],c3[1],kernel_size=5,padding=2)\n",
    "        #线路4 最大汇聚层3x3填充1，后接1x1卷积层\n",
    "        self.p4_1=nn.MaxPool2d(kernel_size=3,stride=1,padding=1)\n",
    "        self.p4_2=nn.Conv2d(in_channels,c4,kernel_size=1)\n",
    "\n",
    "    def forward(self,x):\n",
    "        p1=F.relu(self.p1_1(x))\n",
    "        p2=F.relu(self.p2_2(F.relu(self.p2_1(x))))\n",
    "        p3=F.relu(self.p3_2(F.relu(self.p3_1(x))))\n",
    "        p4=F.relu(self.p4_2(self.p4_1(x)))\n",
    "        return torch.cat((p1,p2,p3,p4),dim=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# class Inception(nn.Module):\n",
    "# # c1--c4是每条路径的输出通道数\n",
    "#     def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):\n",
    "#         super(Inception, self).__init__(**kwargs)\n",
    "#         # 线路1，单1x1卷积层\n",
    "#         self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)\n",
    "#         # 线路2，1x1卷积层后接3x3卷积层\n",
    "#         self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)\n",
    "#         self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)\n",
    "#         # 线路3，1x1卷积层后接5x5卷积层\n",
    "#         self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)\n",
    "#         self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)\n",
    "#         # 线路4，3x3最大汇聚层后接1x1卷积层\n",
    "#         self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)\n",
    "#         self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)\n",
    "#     def forward(self, x):\n",
    "#         p1 = F.relu(self.p1_1(x))\n",
    "#         p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))\n",
    "#         p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))\n",
    "#         p4 = F.relu(self.p4_2(self.p4_1(x)))\n",
    "#         # 在通道维度上连结输出\n",
    "#         return torch.cat((p1, p2, p3, p4), dim=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 构建GoogLeNet"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一个模块使用64个通道、7 × 7卷积层。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "b1=nn.Sequential(\n",
    "    nn.Conv2d(1,64,kernel_size=7,stride=2,padding=3),nn.ReLU(),\n",
    "    nn.MaxPool2d(kernel_size=3,stride=2,padding=1)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第二个模块使用两个卷积层：第一个卷积层是64个通道、1 × 1卷积层；第二个卷积层使用将通道数量增加三</br>\n",
    "倍的3 × 3卷积层。这对应于Inception块中的第二条路径。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "b2=nn.Sequential(\n",
    "    nn.Conv2d(64,64,kernel_size=1),nn.ReLU(),\n",
    "    nn.Conv2d(64,192,kernel_size=3,padding=1),nn.ReLU(),\n",
    "    nn.MaxPool2d(kernel_size=3,stride=2,padding=1)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第三个模块串联两个完整的Inception块。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "b3=nn.Sequential(Inception(192,64,(96,128),(16,32),32),\n",
    "                 Inception(256,128,(128,192),(32,96),64),\n",
    "                 nn.MaxPool2d(kernel_size=3,stride=2,padding=1)\n",
    "                 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第四模块更加复杂，它串联了5个Inception块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "b4 = nn.Sequential(Inception(480, 192, (96, 208), (16, 48), 64),\n",
    "Inception(512, 160, (112, 224), (24, 64), 64),\n",
    "Inception(512, 128, (128, 256), (24, 64), 64),\n",
    "Inception(512, 112, (144, 288), (32, 64), 64),\n",
    "Inception(528, 256, (160, 320), (32, 128), 128),\n",
    "nn.MaxPool2d(kernel_size=3, stride=2, padding=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第五模块 该模块同NiN一样使用全局平均汇聚层，将每个通道的高和宽变成1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128),\n",
    "Inception(832, 384, (192, 384), (48, 128), 128),\n",
    "nn.AdaptiveAvgPool2d((1,1)),\n",
    "nn.Flatten())#展平\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "net = nn.Sequential(b1, b2, b3, b4, b5, nn.Linear(1024, 10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sequential output shape\t torch.Size([1, 64, 24, 24])\n",
      "Sequential output shape\t torch.Size([1, 192, 12, 12])\n",
      "Sequential output shape\t torch.Size([1, 480, 6, 6])\n",
      "Sequential output shape\t torch.Size([1, 832, 3, 3])\n",
      "Sequential output shape\t torch.Size([1, 1024])\n",
      "Linear output shape\t torch.Size([1, 10])\n"
     ]
    }
   ],
   "source": [
    "X=torch.rand(size=(1,1,96,96))\n",
    "for layer in net:\n",
    "    X=layer(X)\n",
    "    print(layer.__class__.__name__,\"output shape\\t\",X.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**参数初始化**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Sequential(\n",
       "  (0): Sequential(\n",
       "    (0): Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3))\n",
       "    (1): ReLU()\n",
       "    (2): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (1): Sequential(\n",
       "    (0): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "    (1): ReLU()\n",
       "    (2): Conv2d(64, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "    (3): ReLU()\n",
       "    (4): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (2): Sequential(\n",
       "    (0): Inception(\n",
       "      (p1_1): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(96, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(192, 16, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(16, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (1): Inception(\n",
       "      (p1_1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(128, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(256, 32, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(32, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (2): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (3): Sequential(\n",
       "    (0): Inception(\n",
       "      (p1_1): Conv2d(480, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(480, 96, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(96, 208, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(480, 16, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(16, 48, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(480, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (1): Inception(\n",
       "      (p1_1): Conv2d(512, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(112, 224, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(24, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (2): Inception(\n",
       "      (p1_1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(512, 24, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(24, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (3): Inception(\n",
       "      (p1_1): Conv2d(512, 112, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(512, 144, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(144, 288, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(512, 32, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(512, 64, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (4): Inception(\n",
       "      (p1_1): Conv2d(528, 256, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(528, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(528, 32, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(528, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (5): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n",
       "  )\n",
       "  (4): Sequential(\n",
       "    (0): Inception(\n",
       "      (p1_1): Conv2d(832, 256, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(832, 160, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(160, 320, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(832, 32, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(32, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (1): Inception(\n",
       "      (p1_1): Conv2d(832, 384, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_1): Conv2d(832, 192, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p2_2): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n",
       "      (p3_1): Conv2d(832, 48, kernel_size=(1, 1), stride=(1, 1))\n",
       "      (p3_2): Conv2d(48, 128, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))\n",
       "      (p4_1): MaxPool2d(kernel_size=3, stride=1, padding=1, dilation=1, ceil_mode=False)\n",
       "      (p4_2): Conv2d(832, 128, kernel_size=(1, 1), stride=(1, 1))\n",
       "    )\n",
       "    (2): AdaptiveAvgPool2d(output_size=(1, 1))\n",
       "    (3): Flatten(start_dim=1, end_dim=-1)\n",
       "  )\n",
       "  (5): Linear(in_features=1024, out_features=10, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def init_parameters(m):\n",
    "    if type(m)==nn.Conv2d or type(m)==nn.Linear:\n",
    "        nn.init.xavier_uniform_(m.weight)\n",
    "net.apply(init_parameters)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 数据加载与训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将图片规格变为96x96"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch import nn\n",
    "from torchvision import datasets,transforms\n",
    "trans_size=transforms.Compose([\n",
    "    transforms.Resize((96,96)),\n",
    "    transforms.ToTensor()\n",
    "])\n",
    "\n",
    "# 下载训练集\n",
    "train_dataset = datasets.MNIST(root='./num/',\n",
    "                               train=True,\n",
    "                               transform=trans_size,\n",
    "                               download=True)\n",
    "# 下载测试集\n",
    "test_dataset = datasets.MNIST(root='./num/',\n",
    "                              train=False,\n",
    "                              transform=trans_size,\n",
    "                              download=True)\n",
    "#制作迭代器\n",
    "train_iter_tensor=torch.utils.data.DataLoader(\n",
    "    train_dataset,\n",
    "    batch_size=128,\n",
    "    shuffle=True\n",
    ")\n",
    "test_iter_tensor=torch.utils.data.DataLoader(\n",
    "    test_dataset,\n",
    "    batch_size=128,\n",
    "    shuffle=True\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "loss=nn.CrossEntropyLoss(reduction=\"none\")\n",
    "optimizer=torch.optim.SGD(net.parameters(),lr=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1轮训练loss: tensor(2.3024, grad_fn=<MeanBackward0>)\n",
      "2轮训练loss: tensor(2.3029, grad_fn=<MeanBackward0>)\n",
      "3轮训练loss: tensor(1.8889, grad_fn=<MeanBackward0>)\n",
      "4轮训练loss: tensor(0.5979, grad_fn=<MeanBackward0>)\n",
      "5轮训练loss: tensor(0.2927, grad_fn=<MeanBackward0>)\n",
      "6轮训练loss: tensor(0.6124, grad_fn=<MeanBackward0>)\n",
      "7轮训练loss: tensor(0.0279, grad_fn=<MeanBackward0>)\n",
      "8轮训练loss: tensor(0.0180, grad_fn=<MeanBackward0>)\n",
      "9轮训练loss: tensor(0.0589, grad_fn=<MeanBackward0>)\n",
      "10轮训练loss: tensor(0.0256, grad_fn=<MeanBackward0>)\n"
     ]
    }
   ],
   "source": [
    "num_epochs=10\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "    net=net.to(torch.device(\"cuda:0\"))\n",
    "    for x,y in train_iter_tensor:\n",
    "        x=x.to(torch.device(\"cuda:0\"))\n",
    "        y=y.to(torch.device(\"cuda:0\"))\n",
    "       \n",
    "        optimizer.zero_grad()\n",
    "        l=loss(net(x),y)\n",
    "        l.mean().backward()\n",
    "        optimizer.step()\n",
    "        # print(l.mean())\n",
    "    net=net.to(torch.device(\"cpu\"))\n",
    "    for x_t,y_t in test_iter_tensor:\n",
    "        loss_temp=loss(net(x_t),y_t)\n",
    "        print(f\"{epoch+1}轮训练loss:\",loss_temp.mean())\n",
    "        break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**D2l**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss 0.249, train acc 0.906, test acc 0.895\n",
      "993.8 examples/sec on cuda:0\n"
     ]
    },
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"238.965625pt\" height=\"183.35625pt\" viewBox=\"0 0 238.965625 183.35625\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n",
       " <metadata>\n",
       "  <rdf:RDF xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n",
       "   <cc:Work>\n",
       "    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n",
       "    <dc:date>2025-02-01T22:17:33.706363</dc:date>\n",
       "    <dc:format>image/svg+xml</dc:format>\n",
       "    <dc:creator>\n",
       "     <cc:Agent>\n",
       "      <dc:title>Matplotlib v3.7.2, https://matplotlib.org/</dc:title>\n",
       "     </cc:Agent>\n",
       "    </dc:creator>\n",
       "   </cc:Work>\n",
       "  </rdf:RDF>\n",
       " </metadata>\n",
       " <defs>\n",
       "  <style type=\"text/css\">*{stroke-linejoin: round; stroke-linecap: butt}</style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 183.35625 \n",
       "L 238.965625 183.35625 \n",
       "L 238.965625 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 30.103125 145.8 \n",
       "L 225.403125 145.8 \n",
       "L 225.403125 7.2 \n",
       "L 30.103125 7.2 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\">\n",
       "    <g id=\"xtick_1\">\n",
       "     <g id=\"line2d_1\">\n",
       "      <path d=\"M 51.803125 145.8 \n",
       "L 51.803125 7.2 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_2\">\n",
       "      <defs>\n",
       "       <path id=\"md3cfcad324\" d=\"M 0 0 \n",
       "L 0 3.5 \n",
       "\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use xlink:href=\"#md3cfcad324\" x=\"51.803125\" y=\"145.8\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_1\">\n",
       "      <!-- 2 -->\n",
       "      <g transform=\"translate(48.621875 160.398438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-32\" d=\"M 1228 531 \n",
       "L 3431 531 \n",
       "L 3431 0 \n",
       "L 469 0 \n",
       "L 469 531 \n",
       "Q 828 903 1448 1529 \n",
       "Q 2069 2156 2228 2338 \n",
       "Q 2531 2678 2651 2914 \n",
       "Q 2772 3150 2772 3378 \n",
       "Q 2772 3750 2511 3984 \n",
       "Q 2250 4219 1831 4219 \n",
       "Q 1534 4219 1204 4116 \n",
       "Q 875 4013 500 3803 \n",
       "L 500 4441 \n",
       "Q 881 4594 1212 4672 \n",
       "Q 1544 4750 1819 4750 \n",
       "Q 2544 4750 2975 4387 \n",
       "Q 3406 4025 3406 3419 \n",
       "Q 3406 3131 3298 2873 \n",
       "Q 3191 2616 2906 2266 \n",
       "Q 2828 2175 2409 1742 \n",
       "Q 1991 1309 1228 531 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_2\">\n",
       "     <g id=\"line2d_3\">\n",
       "      <path d=\"M 95.203125 145.8 \n",
       "L 95.203125 7.2 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_4\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#md3cfcad324\" x=\"95.203125\" y=\"145.8\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_2\">\n",
       "      <!-- 4 -->\n",
       "      <g transform=\"translate(92.021875 160.398438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-34\" d=\"M 2419 4116 \n",
       "L 825 1625 \n",
       "L 2419 1625 \n",
       "L 2419 4116 \n",
       "z\n",
       "M 2253 4666 \n",
       "L 3047 4666 \n",
       "L 3047 1625 \n",
       "L 3713 1625 \n",
       "L 3713 1100 \n",
       "L 3047 1100 \n",
       "L 3047 0 \n",
       "L 2419 0 \n",
       "L 2419 1100 \n",
       "L 313 1100 \n",
       "L 313 1709 \n",
       "L 2253 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-34\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_3\">\n",
       "     <g id=\"line2d_5\">\n",
       "      <path d=\"M 138.603125 145.8 \n",
       "L 138.603125 7.2 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_6\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#md3cfcad324\" x=\"138.603125\" y=\"145.8\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_3\">\n",
       "      <!-- 6 -->\n",
       "      <g transform=\"translate(135.421875 160.398438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-36\" d=\"M 2113 2584 \n",
       "Q 1688 2584 1439 2293 \n",
       "Q 1191 2003 1191 1497 \n",
       "Q 1191 994 1439 701 \n",
       "Q 1688 409 2113 409 \n",
       "Q 2538 409 2786 701 \n",
       "Q 3034 994 3034 1497 \n",
       "Q 3034 2003 2786 2293 \n",
       "Q 2538 2584 2113 2584 \n",
       "z\n",
       "M 3366 4563 \n",
       "L 3366 3988 \n",
       "Q 3128 4100 2886 4159 \n",
       "Q 2644 4219 2406 4219 \n",
       "Q 1781 4219 1451 3797 \n",
       "Q 1122 3375 1075 2522 \n",
       "Q 1259 2794 1537 2939 \n",
       "Q 1816 3084 2150 3084 \n",
       "Q 2853 3084 3261 2657 \n",
       "Q 3669 2231 3669 1497 \n",
       "Q 3669 778 3244 343 \n",
       "Q 2819 -91 2113 -91 \n",
       "Q 1303 -91 875 529 \n",
       "Q 447 1150 447 2328 \n",
       "Q 447 3434 972 4092 \n",
       "Q 1497 4750 2381 4750 \n",
       "Q 2619 4750 2861 4703 \n",
       "Q 3103 4656 3366 4563 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-36\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_4\">\n",
       "     <g id=\"line2d_7\">\n",
       "      <path d=\"M 182.003125 145.8 \n",
       "L 182.003125 7.2 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_8\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#md3cfcad324\" x=\"182.003125\" y=\"145.8\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_4\">\n",
       "      <!-- 8 -->\n",
       "      <g transform=\"translate(178.821875 160.398438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-38\" d=\"M 2034 2216 \n",
       "Q 1584 2216 1326 1975 \n",
       "Q 1069 1734 1069 1313 \n",
       "Q 1069 891 1326 650 \n",
       "Q 1584 409 2034 409 \n",
       "Q 2484 409 2743 651 \n",
       "Q 3003 894 3003 1313 \n",
       "Q 3003 1734 2745 1975 \n",
       "Q 2488 2216 2034 2216 \n",
       "z\n",
       "M 1403 2484 \n",
       "Q 997 2584 770 2862 \n",
       "Q 544 3141 544 3541 \n",
       "Q 544 4100 942 4425 \n",
       "Q 1341 4750 2034 4750 \n",
       "Q 2731 4750 3128 4425 \n",
       "Q 3525 4100 3525 3541 \n",
       "Q 3525 3141 3298 2862 \n",
       "Q 3072 2584 2669 2484 \n",
       "Q 3125 2378 3379 2068 \n",
       "Q 3634 1759 3634 1313 \n",
       "Q 3634 634 3220 271 \n",
       "Q 2806 -91 2034 -91 \n",
       "Q 1263 -91 848 271 \n",
       "Q 434 634 434 1313 \n",
       "Q 434 1759 690 2068 \n",
       "Q 947 2378 1403 2484 \n",
       "z\n",
       "M 1172 3481 \n",
       "Q 1172 3119 1398 2916 \n",
       "Q 1625 2713 2034 2713 \n",
       "Q 2441 2713 2670 2916 \n",
       "Q 2900 3119 2900 3481 \n",
       "Q 2900 3844 2670 4047 \n",
       "Q 2441 4250 2034 4250 \n",
       "Q 1625 4250 1398 4047 \n",
       "Q 1172 3844 1172 3481 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-38\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_5\">\n",
       "     <g id=\"line2d_9\">\n",
       "      <path d=\"M 225.403125 145.8 \n",
       "L 225.403125 7.2 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_10\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#md3cfcad324\" x=\"225.403125\" y=\"145.8\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_5\">\n",
       "      <!-- 10 -->\n",
       "      <g transform=\"translate(219.040625 160.398438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-31\" d=\"M 794 531 \n",
       "L 1825 531 \n",
       "L 1825 4091 \n",
       "L 703 3866 \n",
       "L 703 4441 \n",
       "L 1819 4666 \n",
       "L 2450 4666 \n",
       "L 2450 531 \n",
       "L 3481 531 \n",
       "L 3481 0 \n",
       "L 794 0 \n",
       "L 794 531 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "        <path id=\"DejaVuSans-30\" d=\"M 2034 4250 \n",
       "Q 1547 4250 1301 3770 \n",
       "Q 1056 3291 1056 2328 \n",
       "Q 1056 1369 1301 889 \n",
       "Q 1547 409 2034 409 \n",
       "Q 2525 409 2770 889 \n",
       "Q 3016 1369 3016 2328 \n",
       "Q 3016 3291 2770 3770 \n",
       "Q 2525 4250 2034 4250 \n",
       "z\n",
       "M 2034 4750 \n",
       "Q 2819 4750 3233 4129 \n",
       "Q 3647 3509 3647 2328 \n",
       "Q 3647 1150 3233 529 \n",
       "Q 2819 -91 2034 -91 \n",
       "Q 1250 -91 836 529 \n",
       "Q 422 1150 422 2328 \n",
       "Q 422 3509 836 4129 \n",
       "Q 1250 4750 2034 4750 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"text_6\">\n",
       "     <!-- epoch -->\n",
       "     <g transform=\"translate(112.525 174.076563) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-65\" d=\"M 3597 1894 \n",
       "L 3597 1613 \n",
       "L 953 1613 \n",
       "Q 991 1019 1311 708 \n",
       "Q 1631 397 2203 397 \n",
       "Q 2534 397 2845 478 \n",
       "Q 3156 559 3463 722 \n",
       "L 3463 178 \n",
       "Q 3153 47 2828 -22 \n",
       "Q 2503 -91 2169 -91 \n",
       "Q 1331 -91 842 396 \n",
       "Q 353 884 353 1716 \n",
       "Q 353 2575 817 3079 \n",
       "Q 1281 3584 2069 3584 \n",
       "Q 2775 3584 3186 3129 \n",
       "Q 3597 2675 3597 1894 \n",
       "z\n",
       "M 3022 2063 \n",
       "Q 3016 2534 2758 2815 \n",
       "Q 2500 3097 2075 3097 \n",
       "Q 1594 3097 1305 2825 \n",
       "Q 1016 2553 972 2059 \n",
       "L 3022 2063 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-70\" d=\"M 1159 525 \n",
       "L 1159 -1331 \n",
       "L 581 -1331 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2969 \n",
       "Q 1341 3281 1617 3432 \n",
       "Q 1894 3584 2278 3584 \n",
       "Q 2916 3584 3314 3078 \n",
       "Q 3713 2572 3713 1747 \n",
       "Q 3713 922 3314 415 \n",
       "Q 2916 -91 2278 -91 \n",
       "Q 1894 -91 1617 61 \n",
       "Q 1341 213 1159 525 \n",
       "z\n",
       "M 3116 1747 \n",
       "Q 3116 2381 2855 2742 \n",
       "Q 2594 3103 2138 3103 \n",
       "Q 1681 3103 1420 2742 \n",
       "Q 1159 2381 1159 1747 \n",
       "Q 1159 1113 1420 752 \n",
       "Q 1681 391 2138 391 \n",
       "Q 2594 391 2855 752 \n",
       "Q 3116 1113 3116 1747 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6f\" d=\"M 1959 3097 \n",
       "Q 1497 3097 1228 2736 \n",
       "Q 959 2375 959 1747 \n",
       "Q 959 1119 1226 758 \n",
       "Q 1494 397 1959 397 \n",
       "Q 2419 397 2687 759 \n",
       "Q 2956 1122 2956 1747 \n",
       "Q 2956 2369 2687 2733 \n",
       "Q 2419 3097 1959 3097 \n",
       "z\n",
       "M 1959 3584 \n",
       "Q 2709 3584 3137 3096 \n",
       "Q 3566 2609 3566 1747 \n",
       "Q 3566 888 3137 398 \n",
       "Q 2709 -91 1959 -91 \n",
       "Q 1206 -91 779 398 \n",
       "Q 353 888 353 1747 \n",
       "Q 353 2609 779 3096 \n",
       "Q 1206 3584 1959 3584 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-63\" d=\"M 3122 3366 \n",
       "L 3122 2828 \n",
       "Q 2878 2963 2633 3030 \n",
       "Q 2388 3097 2138 3097 \n",
       "Q 1578 3097 1268 2742 \n",
       "Q 959 2388 959 1747 \n",
       "Q 959 1106 1268 751 \n",
       "Q 1578 397 2138 397 \n",
       "Q 2388 397 2633 464 \n",
       "Q 2878 531 3122 666 \n",
       "L 3122 134 \n",
       "Q 2881 22 2623 -34 \n",
       "Q 2366 -91 2075 -91 \n",
       "Q 1284 -91 818 406 \n",
       "Q 353 903 353 1747 \n",
       "Q 353 2603 823 3093 \n",
       "Q 1294 3584 2113 3584 \n",
       "Q 2378 3584 2631 3529 \n",
       "Q 2884 3475 3122 3366 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-68\" d=\"M 3513 2113 \n",
       "L 3513 0 \n",
       "L 2938 0 \n",
       "L 2938 2094 \n",
       "Q 2938 2591 2744 2837 \n",
       "Q 2550 3084 2163 3084 \n",
       "Q 1697 3084 1428 2787 \n",
       "Q 1159 2491 1159 1978 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 4863 \n",
       "L 1159 4863 \n",
       "L 1159 2956 \n",
       "Q 1366 3272 1645 3428 \n",
       "Q 1925 3584 2291 3584 \n",
       "Q 2894 3584 3203 3211 \n",
       "Q 3513 2838 3513 2113 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-65\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-70\" x=\"61.523438\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6f\" x=\"125\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"186.181641\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-68\" x=\"241.162109\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_2\">\n",
       "    <g id=\"ytick_1\">\n",
       "     <g id=\"line2d_11\">\n",
       "      <path d=\"M 30.103125 145.552454 \n",
       "L 225.403125 145.552454 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_12\">\n",
       "      <defs>\n",
       "       <path id=\"m597e3784a3\" d=\"M 0 0 \n",
       "L -3.5 0 \n",
       "\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use xlink:href=\"#m597e3784a3\" x=\"30.103125\" y=\"145.552454\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_7\">\n",
       "      <!-- 0.0 -->\n",
       "      <g transform=\"translate(7.2 149.351672) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-2e\" d=\"M 684 794 \n",
       "L 1344 794 \n",
       "L 1344 0 \n",
       "L 684 0 \n",
       "L 684 794 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_2\">\n",
       "     <g id=\"line2d_13\">\n",
       "      <path d=\"M 30.103125 116.939107 \n",
       "L 225.403125 116.939107 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_14\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m597e3784a3\" x=\"30.103125\" y=\"116.939107\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_8\">\n",
       "      <!-- 0.5 -->\n",
       "      <g transform=\"translate(7.2 120.738326) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-35\" d=\"M 691 4666 \n",
       "L 3169 4666 \n",
       "L 3169 4134 \n",
       "L 1269 4134 \n",
       "L 1269 2991 \n",
       "Q 1406 3038 1543 3061 \n",
       "Q 1681 3084 1819 3084 \n",
       "Q 2600 3084 3056 2656 \n",
       "Q 3513 2228 3513 1497 \n",
       "Q 3513 744 3044 326 \n",
       "Q 2575 -91 1722 -91 \n",
       "Q 1428 -91 1123 -41 \n",
       "Q 819 9 494 109 \n",
       "L 494 744 \n",
       "Q 775 591 1075 516 \n",
       "Q 1375 441 1709 441 \n",
       "Q 2250 441 2565 725 \n",
       "Q 2881 1009 2881 1497 \n",
       "Q 2881 1984 2565 2268 \n",
       "Q 2250 2553 1709 2553 \n",
       "Q 1456 2553 1204 2497 \n",
       "Q 953 2441 691 2322 \n",
       "L 691 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_3\">\n",
       "     <g id=\"line2d_15\">\n",
       "      <path d=\"M 30.103125 88.32576 \n",
       "L 225.403125 88.32576 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_16\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m597e3784a3\" x=\"30.103125\" y=\"88.32576\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_9\">\n",
       "      <!-- 1.0 -->\n",
       "      <g transform=\"translate(7.2 92.124979) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_4\">\n",
       "     <g id=\"line2d_17\">\n",
       "      <path d=\"M 30.103125 59.712414 \n",
       "L 225.403125 59.712414 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_18\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m597e3784a3\" x=\"30.103125\" y=\"59.712414\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_10\">\n",
       "      <!-- 1.5 -->\n",
       "      <g transform=\"translate(7.2 63.511633) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_5\">\n",
       "     <g id=\"line2d_19\">\n",
       "      <path d=\"M 30.103125 31.099067 \n",
       "L 225.403125 31.099067 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_20\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m597e3784a3\" x=\"30.103125\" y=\"31.099067\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_11\">\n",
       "      <!-- 2.0 -->\n",
       "      <g transform=\"translate(7.2 34.898286) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"line2d_21\">\n",
       "    <path d=\"M 12.70611 13.5 \n",
       "L 17.009095 13.878977 \n",
       "L 21.31208 15.277417 \n",
       "L 25.615065 17.887987 \n",
       "L 29.91805 23.552327 \n",
       "L 30.103125 23.896323 \n",
       "L 34.40611 79.120297 \n",
       "L 38.709095 85.741441 \n",
       "L 43.01208 89.676296 \n",
       "L 47.315065 93.266 \n",
       "L 51.61805 96.466869 \n",
       "L 51.803125 96.594465 \n",
       "L 56.10611 69.574155 \n",
       "L 60.409095 81.491206 \n",
       "L 64.71208 91.06937 \n",
       "L 69.015065 96.315534 \n",
       "L 73.31805 100.681248 \n",
       "L 73.503125 100.802311 \n",
       "L 77.80611 119.322454 \n",
       "L 82.109095 119.866434 \n",
       "L 86.41208 120.098418 \n",
       "L 90.715065 120.492392 \n",
       "L 95.01805 120.98344 \n",
       "L 95.203125 121.004031 \n",
       "L 99.50611 124.460116 \n",
       "L 103.809095 124.207356 \n",
       "L 108.11208 124.591155 \n",
       "L 112.415065 124.784176 \n",
       "L 116.71805 124.95765 \n",
       "L 116.903125 124.992075 \n",
       "L 121.20611 126.573315 \n",
       "L 125.509095 126.797614 \n",
       "L 129.81208 126.85444 \n",
       "L 134.115065 126.97248 \n",
       "L 138.41805 127.058821 \n",
       "L 138.603125 127.067067 \n",
       "L 142.90611 128.064846 \n",
       "L 147.209095 128.065187 \n",
       "L 151.51208 128.144798 \n",
       "L 155.815065 128.234484 \n",
       "L 160.11805 128.306614 \n",
       "L 160.303125 128.319701 \n",
       "L 164.60611 129.007258 \n",
       "L 168.909095 129.220352 \n",
       "L 173.21208 129.363319 \n",
       "L 177.515065 129.34123 \n",
       "L 181.81805 129.489313 \n",
       "L 182.003125 129.471238 \n",
       "L 186.30611 130.940804 \n",
       "L 190.609095 130.601684 \n",
       "L 194.91208 130.448481 \n",
       "L 199.215065 130.489326 \n",
       "L 203.51805 130.53821 \n",
       "L 203.703125 130.528313 \n",
       "L 208.00611 131.636461 \n",
       "L 212.309095 131.369796 \n",
       "L 216.61208 131.333818 \n",
       "L 220.915065 131.228643 \n",
       "L 225.21805 131.2911 \n",
       "L 225.403125 131.295994 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"line2d_22\">\n",
       "    <path d=\"M 12.70611 139.5 \n",
       "L 17.009095 138.872641 \n",
       "L 21.31208 138.099459 \n",
       "L 25.615065 137.026618 \n",
       "L 29.91805 135.218574 \n",
       "L 30.103125 135.104767 \n",
       "L 34.40611 115.79015 \n",
       "L 38.709095 112.672584 \n",
       "L 43.01208 110.937932 \n",
       "L 47.315065 109.315852 \n",
       "L 51.61805 107.881098 \n",
       "L 51.803125 107.832433 \n",
       "L 56.10611 115.054626 \n",
       "L 60.409095 111.538049 \n",
       "L 64.71208 108.322733 \n",
       "L 69.015065 106.525185 \n",
       "L 73.31805 104.981305 \n",
       "L 73.503125 104.938669 \n",
       "L 77.80611 98.200057 \n",
       "L 82.109095 98.087084 \n",
       "L 86.41208 97.948472 \n",
       "L 90.715065 97.823882 \n",
       "L 95.01805 97.598177 \n",
       "L 95.203125 97.585039 \n",
       "L 99.50611 96.248273 \n",
       "L 103.809095 96.320383 \n",
       "L 108.11208 96.195392 \n",
       "L 112.415065 96.182172 \n",
       "L 116.71805 96.097322 \n",
       "L 116.903125 96.084746 \n",
       "L 121.20611 95.483904 \n",
       "L 125.509095 95.47429 \n",
       "L 129.81208 95.411794 \n",
       "L 134.115065 95.406987 \n",
       "L 138.41805 95.346414 \n",
       "L 138.603125 95.341753 \n",
       "L 142.90611 95.041628 \n",
       "L 147.209095 94.993555 \n",
       "L 151.51208 94.955096 \n",
       "L 155.815065 94.919041 \n",
       "L 160.11805 94.894523 \n",
       "L 160.303125 94.89157 \n",
       "L 164.60611 94.65704 \n",
       "L 168.909095 94.570508 \n",
       "L 173.21208 94.490385 \n",
       "L 177.515065 94.464746 \n",
       "L 181.81805 94.378214 \n",
       "L 182.003125 94.380345 \n",
       "L 186.30611 93.897479 \n",
       "L 190.609095 94.032085 \n",
       "L 194.91208 94.129834 \n",
       "L 199.215065 94.076553 \n",
       "L 203.51805 94.071505 \n",
       "L 203.703125 94.072274 \n",
       "L 208.00611 93.657111 \n",
       "L 212.309095 93.731625 \n",
       "L 216.61208 93.69557 \n",
       "L 220.915065 93.755662 \n",
       "L 225.21805 93.72153 \n",
       "L 225.403125 93.719376 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #bf00bf; stroke-width: 1.5\"/>\n",
       "   </g>\n",
       "   <g id=\"line2d_23\">\n",
       "    <path d=\"M 30.103125 115.754514 \n",
       "L 51.803125 101.138817 \n",
       "L 73.503125 99.925611 \n",
       "L 95.203125 96.720916 \n",
       "L 116.903125 96.984159 \n",
       "L 138.603125 95.702281 \n",
       "L 160.303125 95.295972 \n",
       "L 182.003125 95.072788 \n",
       "L 203.703125 94.878217 \n",
       "L 225.403125 94.323118 \n",
       "\" clip-path=\"url(#pd2e7bebf4c)\" style=\"fill: none; stroke-dasharray: 9.6,2.4,1.5,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 30.103125 145.8 \n",
       "L 30.103125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 225.403125 145.8 \n",
       "L 225.403125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 30.103125 145.8 \n",
       "L 225.403125 145.8 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 30.103125 7.2 \n",
       "L 225.403125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"legend_1\">\n",
       "    <g id=\"patch_7\">\n",
       "     <path d=\"M 140.634375 59.234375 \n",
       "L 218.403125 59.234375 \n",
       "Q 220.403125 59.234375 220.403125 57.234375 \n",
       "L 220.403125 14.2 \n",
       "Q 220.403125 12.2 218.403125 12.2 \n",
       "L 140.634375 12.2 \n",
       "Q 138.634375 12.2 138.634375 14.2 \n",
       "L 138.634375 57.234375 \n",
       "Q 138.634375 59.234375 140.634375 59.234375 \n",
       "z\n",
       "\" style=\"fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter\"/>\n",
       "    </g>\n",
       "    <g id=\"line2d_24\">\n",
       "     <path d=\"M 142.634375 20.298438 \n",
       "L 152.634375 20.298438 \n",
       "L 162.634375 20.298438 \n",
       "\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_12\">\n",
       "     <!-- train loss -->\n",
       "     <g transform=\"translate(170.634375 23.798438) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-74\" d=\"M 1172 4494 \n",
       "L 1172 3500 \n",
       "L 2356 3500 \n",
       "L 2356 3053 \n",
       "L 1172 3053 \n",
       "L 1172 1153 \n",
       "Q 1172 725 1289 603 \n",
       "Q 1406 481 1766 481 \n",
       "L 2356 481 \n",
       "L 2356 0 \n",
       "L 1766 0 \n",
       "Q 1100 0 847 248 \n",
       "Q 594 497 594 1153 \n",
       "L 594 3053 \n",
       "L 172 3053 \n",
       "L 172 3500 \n",
       "L 594 3500 \n",
       "L 594 4494 \n",
       "L 1172 4494 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-72\" d=\"M 2631 2963 \n",
       "Q 2534 3019 2420 3045 \n",
       "Q 2306 3072 2169 3072 \n",
       "Q 1681 3072 1420 2755 \n",
       "Q 1159 2438 1159 1844 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2956 \n",
       "Q 1341 3275 1631 3429 \n",
       "Q 1922 3584 2338 3584 \n",
       "Q 2397 3584 2469 3576 \n",
       "Q 2541 3569 2628 3553 \n",
       "L 2631 2963 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-61\" d=\"M 2194 1759 \n",
       "Q 1497 1759 1228 1600 \n",
       "Q 959 1441 959 1056 \n",
       "Q 959 750 1161 570 \n",
       "Q 1363 391 1709 391 \n",
       "Q 2188 391 2477 730 \n",
       "Q 2766 1069 2766 1631 \n",
       "L 2766 1759 \n",
       "L 2194 1759 \n",
       "z\n",
       "M 3341 1997 \n",
       "L 3341 0 \n",
       "L 2766 0 \n",
       "L 2766 531 \n",
       "Q 2569 213 2275 61 \n",
       "Q 1981 -91 1556 -91 \n",
       "Q 1019 -91 701 211 \n",
       "Q 384 513 384 1019 \n",
       "Q 384 1609 779 1909 \n",
       "Q 1175 2209 1959 2209 \n",
       "L 2766 2209 \n",
       "L 2766 2266 \n",
       "Q 2766 2663 2505 2880 \n",
       "Q 2244 3097 1772 3097 \n",
       "Q 1472 3097 1187 3025 \n",
       "Q 903 2953 641 2809 \n",
       "L 641 3341 \n",
       "Q 956 3463 1253 3523 \n",
       "Q 1550 3584 1831 3584 \n",
       "Q 2591 3584 2966 3190 \n",
       "Q 3341 2797 3341 1997 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-69\" d=\"M 603 3500 \n",
       "L 1178 3500 \n",
       "L 1178 0 \n",
       "L 603 0 \n",
       "L 603 3500 \n",
       "z\n",
       "M 603 4863 \n",
       "L 1178 4863 \n",
       "L 1178 4134 \n",
       "L 603 4134 \n",
       "L 603 4863 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6e\" d=\"M 3513 2113 \n",
       "L 3513 0 \n",
       "L 2938 0 \n",
       "L 2938 2094 \n",
       "Q 2938 2591 2744 2837 \n",
       "Q 2550 3084 2163 3084 \n",
       "Q 1697 3084 1428 2787 \n",
       "Q 1159 2491 1159 1978 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2956 \n",
       "Q 1366 3272 1645 3428 \n",
       "Q 1925 3584 2291 3584 \n",
       "Q 2894 3584 3203 3211 \n",
       "Q 3513 2838 3513 2113 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-20\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6c\" d=\"M 603 4863 \n",
       "L 1178 4863 \n",
       "L 1178 0 \n",
       "L 603 0 \n",
       "L 603 4863 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-73\" d=\"M 2834 3397 \n",
       "L 2834 2853 \n",
       "Q 2591 2978 2328 3040 \n",
       "Q 2066 3103 1784 3103 \n",
       "Q 1356 3103 1142 2972 \n",
       "Q 928 2841 928 2578 \n",
       "Q 928 2378 1081 2264 \n",
       "Q 1234 2150 1697 2047 \n",
       "L 1894 2003 \n",
       "Q 2506 1872 2764 1633 \n",
       "Q 3022 1394 3022 966 \n",
       "Q 3022 478 2636 193 \n",
       "Q 2250 -91 1575 -91 \n",
       "Q 1294 -91 989 -36 \n",
       "Q 684 19 347 128 \n",
       "L 347 722 \n",
       "Q 666 556 975 473 \n",
       "Q 1284 391 1588 391 \n",
       "Q 1994 391 2212 530 \n",
       "Q 2431 669 2431 922 \n",
       "Q 2431 1156 2273 1281 \n",
       "Q 2116 1406 1581 1522 \n",
       "L 1381 1569 \n",
       "Q 847 1681 609 1914 \n",
       "Q 372 2147 372 2553 \n",
       "Q 372 3047 722 3315 \n",
       "Q 1072 3584 1716 3584 \n",
       "Q 2034 3584 2315 3537 \n",
       "Q 2597 3491 2834 3397 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-72\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"80.322266\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-69\" x=\"141.601562\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6e\" x=\"169.384766\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-20\" x=\"232.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"264.550781\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6f\" x=\"292.333984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"353.515625\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"405.615234\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"line2d_25\">\n",
       "     <path d=\"M 142.634375 34.976563 \n",
       "L 152.634375 34.976563 \n",
       "L 162.634375 34.976563 \n",
       "\" style=\"fill: none; stroke-dasharray: 5.55,2.4; stroke-dashoffset: 0; stroke: #bf00bf; stroke-width: 1.5\"/>\n",
       "    </g>\n",
       "    <g id=\"text_13\">\n",
       "     <!-- train acc -->\n",
       "     <g transform=\"translate(170.634375 38.476563) scale(0.1 -0.1)\">\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-72\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"80.322266\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-69\" x=\"141.601562\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6e\" x=\"169.384766\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-20\" x=\"232.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"264.550781\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"325.830078\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"380.810547\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"line2d_26\">\n",
       "     <path d=\"M 142.634375 49.654688 \n",
       "L 152.634375 49.654688 \n",
       "L 162.634375 49.654688 \n",
       "\" style=\"fill: none; stroke-dasharray: 9.6,2.4,1.5,2.4; stroke-dashoffset: 0; stroke: #008000; stroke-width: 1.5\"/>\n",
       "    </g>\n",
       "    <g id=\"text_14\">\n",
       "     <!-- test acc -->\n",
       "     <g transform=\"translate(170.634375 53.154688) scale(0.1 -0.1)\">\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-65\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"100.732422\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-74\" x=\"152.832031\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-20\" x=\"192.041016\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"223.828125\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"285.107422\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"340.087891\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"pd2e7bebf4c\">\n",
       "   <rect x=\"30.103125\" y=\"7.2\" width=\"195.3\" height=\"138.6\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 350x250 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr, num_epochs, batch_size = 0.1, 10, 128\n",
    "train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)\n",
    "d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "DL_pytorch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
